/**
 * 事件绑定方法集合
 * 
 * @class Events
 */
class Events {
    constructor() {
        /**
         * 事件缓存对象
         * @memberof Events
         */
        this._$event = new Map();
    }
    /**
     * 给事件进行绑定
     * @param {String} str 事件绑定名称
     * @param {Function} event 事件绑定方法
     * @memberof Events
     * @example 
     * Events.on('some',function(){})
     */
    on(str, event) {
        let events = this._$event.has(str) ? this._$event.get(str) : [];
        events.push(event);
        this._$event.set(str, events);
    }
    /**
     * 解除事件绑定
     *
     * @param {String} str 事件绑定名称
     * @param {Function} event 事件绑定方法
     * @memberof Events
     * @example 
     * var fun = function(){ };
     * Events.off('some',fun)
     */
    off(str, event) {
        if (event) {
            let events = this._$event.has(str) ? this._$event.get(str) : [];
            events.filter(element => {
                return element !== events
            })
            this._$event.set(str, events);
        } else {
            this._$event.clear(str);
        }
    }
    /**
     * 运行绑定的事件
     *
     * @param {String} str 事件绑定名称
     * @param {Object} scope 作用域
     * @param {*} arg 任意参数
     * @memberof Events
     * @example 
     * Events.run('some')
     */
    run(str, scope) {
        let that = scope || window;
        let _arguments = [];
        arguments.forEach((element, index) => {
            if (index >= 2) {
                _arguments.push(element);
            }
        });
        let events = this._$event.has(str) ? this._$event.get(str) : [];
        events.forEach(element => {
            element.apply(that, _arguments)
        });
    }
}

export { Events }
